package Real19;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Tree_F {
	
	private int count;
	private ArrayList<Integer> data = new ArrayList<>();
	
	public Tree_F(int count) {
		this.count = count;
	}

	private static int lchild(int i) {
		return 2*i+1;
	}
	private static int rchild(int i) {
		return 2*i+2;
	}
	
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int count = sc.nextInt();
		Tree_F tree_F = new Tree_F(count);
		for(int i=0;i<count;i++)
			tree_F.data.add(i, sc.nextInt());
		
		sc.close();
		System.out.println("权值和最大的level是(同取浅)："+bfs(tree_F));
	}
//1、完全二叉树:想对每一层的所有节点进行操作，其实也可以维护一个height数组，从0节点开始h为1，往下维护孩子的时候+1就行了；
//2、完全二叉树/其他树：如果是对一层元素进行统一的操作，可以维护一个Map<height,List>,以height为索引，来对应一组节点；
//3、这里采用的是针对完全二叉树的基于数学的解决办法：
	static int bfs(Tree_F tree) {
		int max = tree.data.get(0);          //预设： max为第0层的root元素  对应的height也预设为1
		int height = 1;       //因为要层层比较 多次比较，所以要预设变量来不断更新；
		int idealCount = tree.count;  //针对方法3而设定的；
		
		//因为jdk没有log2的函数，所以采取 迭代试错->break 的方式；
		for( int i = 1; Math.pow(2, i)-1 != tree.count; i++ ) {    	//如果刚好本身就是满二叉树就不用进去了；
			if( Math.pow(2, i)-1 < tree.count  &&  Math.pow(2, i+1)-1 > tree.count ) {
				idealCount = (int)Math.pow(2, i+1)-1;  		//计算idealCount是为了方便下边的迭代条件；
				break;
			}
		}
		
		for(int h = 2; Math.pow(2, h)-1 <= idealCount; h++) {  	//从第二层开始和预设进行比较；非满二叉树时最后一层不满也要迭代；
			int startIndex = 0;
			
			for(int time = 0; time < h-1; time++) 
				startIndex = lchild(startIndex);
				
			int sum = 0;
			for( int j = 0; j < Math.pow(2, h-1); j++ ) {  //对每一层的节点进行操作；都进行Math.pow(2, h-1)次，在里面进行越界判断即可！
				if( startIndex+j < tree.data.size() )
					sum += tree.data.get(startIndex+j);
			}
			
			if(sum > max) {  //只做这一个判断，可以保证相等时 保留深度小的；
				height = h;
				max = sum;
			}
			
		}
		
		return height;
	}
	
}
